home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / src / WBBump_src.lha / WBBump_src / prefs.e < prev    next >
Encoding:
Text File  |  1999-06-30  |  6.3 KB  |  344 lines

  1. /* ******* */
  2. /* prefs.e */
  3. /* ******* */
  4.  
  5. OPT MODULE
  6.  
  7.  
  8. /*
  9.     WBBump - Bumpmapping on the Workbench!
  10.  
  11.     Copyright (C) 1999  Thomas Jensen - dm98411@edb.tietgen.dk
  12.  
  13.     This program is free software; you can redistribute it and/or modify
  14.     it under the terms of the GNU General Public License as published by
  15.     the Free Software Foundation; either version 2 of the License, or
  16.     (at your option) any later version.
  17.  
  18.     This program is distributed in the hope that it will be useful,
  19.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.     GNU General Public License for more details.
  22.  
  23.     You should have received a copy of the GNU General Public License
  24.     along with this program; if not, write to the Free Software Foundation,
  25.     Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  26. */
  27.  
  28.  
  29. MODULE    'icon',
  30.  
  31.         'workbench/startup',
  32.         'workbench/workbench',
  33.  
  34.         'wb',
  35.  
  36.         'exec/lists',
  37.         'exec/nodes',
  38.  
  39.         'amigalib/lists'
  40.  
  41.  
  42. MODULE    '*errors',
  43.         '*notify'
  44.  
  45.  
  46. CONST    DEF_WIDTH=200,
  47.         DEF_HEIGHT=75,
  48.         DEF_LEVELS_BIT=4,
  49.         DEF_TASKPRI=-100,
  50.         DEF_STARTDELAY=0,
  51.         DEF_CX_PRI=0
  52.  
  53. EXPORT CONST POS_CENTER = -1
  54.  
  55. EXPORT OBJECT prefs
  56.     scrname     :    PTR TO CHAR
  57.     bumpmapname    :    PTR TO CHAR
  58.     prjname        :    PTR TO CHAR        -> name of the project
  59.     fullprjname    :    PTR TO CHAR        -> name of the project (with path)
  60.     width       :    INT
  61.     height      :    INT
  62.     posx        :    INT
  63.     posy        :    INT
  64.     bumpname    :    PTR TO CHAR
  65.     levels        :    INT
  66.     levels_bit    :    CHAR
  67.     taskpri        :    CHAR
  68.     cxpri        :    CHAR
  69.     startdelay    :    LONG
  70.     notifyreq    :    PTR TO notify
  71.     dirlock        :    LONG
  72.     tooltypes    :    PTR TO LONG
  73.     lightr        :    INT            ->    \
  74.     lightg        :    INT            ->     > light color
  75.     lightb        :    INT            ->    /
  76. ENDOBJECT
  77.  
  78.  
  79. PROC get_def() OF prefs
  80.     self.scrname    := NIL                    -> default = default pub screen
  81.     self.bumpmapname:= 'PROGDIR:Bumpmaps/Amiga.ilbm'
  82.     self.prjname    := NIL
  83.     self.fullprjname:= NIL
  84.     self.width        := DEF_WIDTH
  85.     self.height        := DEF_HEIGHT
  86.     self.posx        := POS_CENTER
  87.     self.posy        := POS_CENTER
  88.     self.bumpname    := NIL            -> internal default
  89.     self.levels_bit    := DEF_LEVELS_BIT
  90.     self.levels     := Shl(1, DEF_LEVELS_BIT)
  91.     self.taskpri    := DEF_TASKPRI
  92.     self.cxpri        := DEF_CX_PRI
  93.     self.startdelay    := DEF_STARTDELAY
  94.     self.notifyreq    := NIL
  95.     self.dirlock    := NIL
  96.     self.tooltypes    := NIL
  97.     self.lightr        := 256
  98.     self.lightg        := 256
  99.     self.lightb        := 256
  100. ENDPROC
  101.  
  102.  
  103. PROC read_prefs() OF prefs HANDLE
  104.  
  105.     /* set defaults */
  106.     self.get_def()
  107.  
  108.  
  109.     /* use right method */
  110.     IF wbmessage = NIL /* started from cli */
  111.         self.read_cli_args()
  112.     ELSE
  113.         self.read_icon()
  114.     ENDIF
  115.  
  116.  
  117. EXCEPT DO
  118.     ReThrow()
  119. ENDPROC
  120.  
  121.  
  122.  
  123.  
  124.  
  125. PROC read_icon() OF prefs HANDLE
  126.     DEF    wbmsg=NIL:PTR TO wbstartup,
  127.         wbarg=NIL:PTR TO wbarg,
  128.         dobj=NIL:PTR TO diskobject,
  129.         iconname=NIL:PTR TO CHAR,
  130.         n=NIL:PTR TO notify,
  131.         tr, tg, tb,
  132.         olddirlock=NIL
  133.  
  134.  
  135.  
  136.     self.get_def()
  137.  
  138.     /* E supplies wbmessage */
  139.     wbmsg := wbmessage
  140.  
  141.     /* get last argument */
  142.     wbarg := wbmsg.arglist[wbmsg.numargs-1]
  143.  
  144.  
  145.     IF wbarg.name = NIL THEN Raise(ERR_INTERNAL)
  146.  
  147.     self.prjname := String(StrLen(wbarg.name)+1)
  148.     StrCopy(self.prjname, wbarg.name)
  149.  
  150.  
  151.     self.dirlock := wbarg.lock
  152.  
  153.     /* cd into executable directory */
  154.     IF self.dirlock THEN olddirlock := CurrentDir(self.dirlock)
  155.  
  156.  
  157.     /* get project name with path */
  158.     self.fullprjname := String(1024)
  159.     IF GetCurrentDirName(self.fullprjname, 1024) = FALSE THEN Throw(ERR_INTERNAL, 'Internal path buffer to small')
  160.     IF AddPart(self.fullprjname, self.prjname, 1024) = FALSE THEN Throw(ERR_INTERNAL, 'Internal path buffer to small')
  161.  
  162.  
  163.     /* get diskobject (ie. icon) */
  164.     IF (dobj := GetDiskObject(self.prjname)) = NIL THEN Raise("cont")
  165.  
  166.  
  167.     /* get copy of tooltypes */
  168.     self.tooltypes := copytooltypes(dobj.tooltypes)
  169.  
  170.  
  171.     /* setup notification request for icon */
  172.     iconname := String(StrLen(self.prjname)+6)
  173.     StringF(iconname, '\s.info', self.prjname)
  174.     NEW n.notify(iconname)
  175.     self.notifyreq := n
  176.  
  177.  
  178.  
  179.  
  180.     /* parse tooltypes */
  181.  
  182.     self.scrname := stringFindToolType(self.tooltypes, 'SCREENNAME', NIL)
  183.  
  184.  
  185.     self.bumpmapname := stringFindToolType(self.tooltypes, 'BUMPMAP', NIL)
  186.  
  187.  
  188.     self.taskpri := intFindToolType(self.tooltypes, 'TASKPRI', -128, 127, -100)
  189.  
  190.  
  191.     self.levels_bit := intFindToolType(self.tooltypes, 'DEPTH', 1, 8, 3)
  192.     self.levels := Shl(1, self.levels_bit)
  193.  
  194.  
  195.     self.startdelay := intFindToolType(self.tooltypes, 'STARTDELAY', 0, 100, 0)
  196.  
  197.  
  198.     self.posx := intFindToolType(self.tooltypes, 'POSITIONX', 0, 32000, POS_CENTER)
  199.  
  200.     self.posy := intFindToolType(self.tooltypes, 'POSITIONY', 0, 32000, POS_CENTER)
  201.  
  202.  
  203.     tr, tg, tb := rgbFindToolType(self.tooltypes, 'LIGHTCOLOR', 256, 256, 256)
  204.     self.lightr := tr
  205.     self.lightg := tg
  206.     self.lightb := tb
  207.  
  208. EXCEPT DO
  209.     IF olddirlock THEN CurrentDir(olddirlock)
  210.     IF dobj THEN FreeDiskObject(dobj)
  211.     IF exception <> "cont" THEN ReThrow()
  212. ENDPROC
  213.  
  214.  
  215.  
  216. PROC read_cli_args() OF prefs HANDLE
  217.  
  218.     self.get_def()
  219.  
  220. EXCEPT DO
  221.     ReThrow()
  222. ENDPROC
  223.  
  224.  
  225. PROC haschanged() OF prefs
  226.     IF self.notifyreq THEN RETURN self.notifyreq.haschanged()
  227. ENDPROC FALSE
  228.  
  229.  
  230.  
  231. PROC edit() OF prefs HANDLE
  232.     DEF    scr=NIL
  233.  
  234.     IF (self.prjname) AND (self.dirlock)
  235.         IF (scr := LockPubScreen(self.scrname))
  236.             IF WbInfo(self.dirlock, self.prjname, scr) = FALSE THEN DisplayBeep(NIL)
  237.         ENDIF
  238.     ENDIF
  239.  
  240. EXCEPT DO
  241.     IF scr THEN UnlockPubScreen(NIL, scr)
  242. ENDPROC
  243.  
  244.  
  245. PROC end() OF prefs
  246.     END self.notifyreq
  247. ENDPROC
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263. /* support functions */
  264. PROC stringFindToolType(tt, typename, def)
  265.     DEF    strptr, str=NIL
  266.     strptr := FindToolType(tt, typename)
  267.     IF strptr
  268.         str := String(StrLen(strptr)+1)
  269.         StrCopy(str, strptr)
  270.     ELSE
  271.         str := def
  272.     ENDIF
  273. ENDPROC str
  274.  
  275.  
  276. PROC intFindToolType(tt, typename, min, max, def)
  277.     DEF    int, val, read,
  278.         strptr
  279.  
  280.     int := def
  281.  
  282.     strptr := FindToolType(tt, typename)
  283.     IF strptr
  284.         val, read := Val(strptr)
  285.         IF read > 0
  286.             IF (val >= min) AND (val <= max) THEN int := val
  287.         ENDIF
  288.     ENDIF
  289. ENDPROC int
  290.  
  291.  
  292.  
  293. PROC rgbFindToolType(tt, typename, defr, defg, defb)
  294.     DEF    val, read,
  295.         r, g, b,
  296.         strptr
  297.  
  298.     r := defr
  299.     g := defg
  300.     b := defb
  301.  
  302.     strptr := FindToolType(tt, typename)
  303.     IF strptr
  304.         val, read := Val(strptr)
  305.         IF read > 0
  306.             r := val
  307.  
  308.             strptr := strptr + read
  309.             val, read := Val(strptr)
  310.             IF read > 0
  311.                 g := val
  312.  
  313.                 strptr := strptr + read
  314.                 val, read := Val(strptr)
  315.                 IF read > 0 THEN b := val
  316.             ENDIF
  317.         ENDIF
  318.     ENDIF
  319. ENDPROC r, g, b
  320.  
  321.  
  322.  
  323.  
  324. PROC copytooltypes(tt:PTR TO LONG)
  325.     DEF    newtt=NIL:PTR TO LONG,
  326.         count=0,
  327.         i
  328.  
  329.     WHILE tt[count] <> 0
  330.         count++
  331.     ENDWHILE
  332.  
  333.     newtt := NewR((count+1) * SIZEOF LONG)
  334.  
  335.     FOR i := 0 TO count-1
  336.         newtt[i] := String(StrLen(tt[i])+1)
  337.         StrCopy(newtt[i], tt[i])
  338.     ENDFOR
  339.  
  340.     newtt[count] := 0
  341. ENDPROC newtt
  342.  
  343.  
  344.